#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QCheckBox>
#include <QFileDialog>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::getAllFilesInDirectory(const QString &dirPath, QStringList &fileList) {
    QDir dir(dirPath);

    // 获取当前目录下的所有文件
    QStringList files = dir.entryList(QDir::Files);
    for (const QString &file : files) {
        fileList.append(dir.absoluteFilePath(file));
    }

    // 获取当前目录下的所有子目录
    QStringList subDirs = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
    for (const QString &subDir : subDirs) {
        // 递归调用以获取子目录中的文件
        QString subDirPath = dir.absoluteFilePath(subDir);
        getAllFilesInDirectory(subDirPath, fileList);
    }
}

// 函数来从完整路径列表中提取文件名和扩展名
void extractFilenamesAndExtensions(const QStringList &fullPaths, QStringList &filenames, QStringList &extensions) {
    for (const QString &fullPath : fullPaths) {
        QFileInfo fileInfo(fullPath);
        QString fileName = fileInfo.fileName(); // 获取文件名
        QString fileExtension = fileInfo.suffix(); // 获取文件扩展名（不带点）
        filenames.append(fileName);
        extensions.append(fileExtension);
    }
}

void MainWindow::on_selectPath_clicked()
{
    QString dir = QFileDialog::getExistingDirectory(this, tr("Open Directory"),
                                                    "/home",
                                                    QFileDialog::ShowDirsOnly
                                                    | QFileDialog::DontResolveSymlinks);
    if(!dir.isEmpty())
        ui->inPutPathEdit->setText(dir);
}

//查找存在的缩略图
void MainWindow::on_scanFile_clicked()
{
    QString startDir = ui->inPutPathEdit->text(); //
    QStringList fileList;

    getAllFilesInDirectory(startDir, fileList);

    if(!fileList.isEmpty()){
        ui->inptFilelist->clear();
        ui->inptFilelist->addItems(fileList);

    }

    // 存储匹配的文件对（jpg文件路径 -> heif文件路径）
    QMap<QString, QString> matchingPairs;

    // 查找匹配的jpg和heif文件
    findMatchingFiles(fileList, matchingPairs);

    // 清除表格中的所有内容（如果需要的话）
    ui->results->clearContents();
    ui->results->setRowCount(0);

    // 设置表格的行数
    ui->results->setRowCount(matchingPairs.size());
    ui->results->setColumnCount(5); // 设置列数

    // 设置列标题
    ui->results->setHorizontalHeaderLabels(QStringList() <<"选中"<< "缩略图" <<"文件体积"<<"原图"<< "文件体积");

    matchingPairs.begin().key();
    int row = 0;
    for (auto it = matchingPairs.begin(); it != matchingPairs.end(); ++it) {
        // 设置行号和内容
//        QCheckBox *fileChecked = new QCheckBox("");// 选择框
//        fileChecked->setChecked(true);
        ui->results->setItem(row, 0, new QTableWidgetItem(0)); // 选择框
        ui->results->item(row, 0)->setCheckState(Qt::Checked);
        ui->results->setItem(row, 1, new QTableWidgetItem(it.key())); // 缩略图文件名
        ui->results->setItem(row, 2, new QTableWidgetItem(QString::number(QFileInfo(it.key()).size()/1024.0/1024.0,'g',2))); // 缩略图文件体积

        ui->results->setItem(row, 3, new QTableWidgetItem(it.value())); // 原图文件名
        ui->results->setItem(row, 4, new QTableWidgetItem(QString::number( QFileInfo(it.value()).size()/1024.0/1024.0,'g',2))); // 原图文件体积


        row++;
    }


}


// 辅助函数：检查文件扩展名
bool MainWindow::hasCorrectExtension(const QString &filePath, const QString &extension) {
    return QFileInfo(filePath).suffix().toLower() == extension.toLower();
}

// 主函数：找出匹配的jpg和heif文件
void MainWindow::findMatchingFiles(const QStringList &filePaths, QMap<QString, QString> &matchingPairs) {
    // 用于存储heif文件名的映射（文件名 -> 完整路径）
    QMap<QString, QString> heifFiles;

    // 第一步：收集所有heif文件
    for (const QString &filePath : filePaths) {
        if (hasCorrectExtension(filePath, "heic")) {
            QString fileName = QFileInfo(filePath).baseName();
            heifFiles.insert(fileName, filePath);
        }
    }

    // 第二步：查找匹配的jpg文件
    for (const QString &filePath : filePaths) {
        if (hasCorrectExtension(filePath, "jpg")) {
            QString fileName = QFileInfo(filePath).baseName();
            // 检查是否有一个匹配的heif文件
            if (heifFiles.contains(fileName)) {
                // 找到了匹配的jpg和heif文件对
                matchingPairs.insert(filePath, heifFiles.value(fileName));

            }
        }
    }
}

bool MainWindow::isImageLargerOrEqual(const QString &filePath1, const QString &filePath2) {
    // 加载两个图片
    QImage image1(filePath1);
    QImage image2(filePath2);

    qDebug()<<image1.size();
    qDebug()<<image2.size();
    // 检查图片是否成功加载
    if (image1.isNull() || image2.isNull()) {
        qDebug() << "Error loading images";
        return false;
    }

    // 获取两个图片的大小
    QSize size1 = image1.size();
    QSize size2 = image2.size();

    qDebug()<<size1<<size2;

    // 检查第一个图片的长和宽是否都大于或等于第二个图片的长和宽
    return (size1.width() >= size2.width()) && (size1.height() >= size2.height());
}
void MainWindow::on_compare_clicked()
{

}


void MainWindow::on_deleteFile_clicked()
{
    for (int row=0;row<ui->results->rowCount();row++){
        bool checked = ui->results->item(row, 0)->checkState() == Qt::Checked; // 检查是否选中
        if (checked) {
            QString fileName = ui->results->item(row, 1)->text();
            if (QFile::exists(fileName)) {
                if (QFile::remove(fileName)) {
                    // 文件删除成功
                    ui->results->item(row, 1)->setBackground(Qt::green);

                } else {
                    // 文件删除失败
                    ui->results->item(row, 1)->setBackground(Qt::red);
                }
            }
        }
    }

}
